/**
 * 音频工具函数 - 用于播放消息通知声音
 */

// 音频文件路径 - 使用本地生成的提示音
export const AUDIO_FILES = {
  message: 'local',
  alert: 'local', 
  success: 'local',
  error: 'local'
};

// 音频实例缓存
const audioInstances = new Map<string, HTMLAudioElement>();

// 全局音频上下文，避免重复创建
let globalAudioContext: AudioContext | null = null;

/**
 * 获取或创建音频上下文
 */
function getAudioContext(): AudioContext {
  if (!globalAudioContext) {
    globalAudioContext = new (window.AudioContext || (window as any).webkitAudioContext)();
    // 预热音频上下文
    if (globalAudioContext.state === 'suspended') {
      globalAudioContext.resume();
    }
  }
  return globalAudioContext;
}

/**
 * 预加载音频文件（现在使用本地生成的提示音，无需网络加载）
 */
export function preloadAudio(type: keyof typeof AUDIO_FILES = 'message'): Promise<void> {
  return new Promise((resolve) => {
    // 预热音频上下文
    const audioContext = getAudioContext();
    if (audioContext.state === 'suspended') {
      audioContext.resume().then(() => resolve());
    } else {
      resolve();
    }
  });
}

/**
 * 播放通知声音
 * @param type 声音类型
 * @param volume 音量 (0-1)
 */
export function playNotificationSound(
  type: keyof typeof AUDIO_FILES = 'message',
  volume: number = 0.2
): void {
  try {
    // 直接使用本地生成的提示音
    playSimpleBeepSound(type, volume);
  } catch (error) {
    console.warn('本地提示音播放失败，使用浏览器默认通知音:', error);
    // 备用方案：使用浏览器默认通知音
    playBrowserNotificationSound(type, volume);
  }
}

/**
 * 播放类似微信的简单提示音（优化版，解决破音问题）
 */
function playSimpleBeepSound(type: keyof typeof AUDIO_FILES, volume: number): void {
  try {
    const audioContext = getAudioContext();
    
    // 确保音频上下文处于运行状态
    if (audioContext.state === 'suspended') {
      audioContext.resume();
    }
    
    const oscillator = audioContext.createOscillator();
    const gainNode = audioContext.createGain();
    
    // 设置类似微信的提示音效果
    oscillator.type = 'sine'; // 正弦波，声音更柔和
    
    // 根据类型设置不同的音调，模仿微信的提示音风格
    switch (type) {
      case 'alert':
        // 警告音：短促的高音
        oscillator.frequency.value = 1000;
        break;
      case 'success':
        // 成功音：清脆的中音
        oscillator.frequency.value = 800;
        break;
      case 'error':
        // 错误音：低沉的音调
        oscillator.frequency.value = 300;
        break;
      default:
        // 默认消息音：类似微信的"叮"声
        oscillator.frequency.value = 600;
    }
    
    oscillator.connect(gainNode);
    gainNode.connect(audioContext.destination);
    
    // 优化音量渐变，避免破音
    const now = audioContext.currentTime;
    
    // 更平滑的音量渐变
    gainNode.gain.setValueAtTime(0.001, now); // 从极小的音量开始
    gainNode.gain.exponentialRampToValueAtTime(volume * 0.8, now + 0.02); // 快速上升到80%
    gainNode.gain.exponentialRampToValueAtTime(volume, now + 0.05); // 缓慢达到目标音量
    
    // 根据类型设置不同的持续时间
    let duration = 0.2; // 默认短促音
    if (type === 'success') {
      duration = 0.2; // 成功音稍长
    } else if (type === 'error') {
      duration = 0.2; // 错误音最长
    }
    
    // 更自然的衰减效果
    gainNode.gain.exponentialRampToValueAtTime(volume * 0.3, now + duration * 0.7);
    gainNode.gain.exponentialRampToValueAtTime(0.001, now + duration);
    
    oscillator.start(now);
    oscillator.stop(now + duration);
    
  } catch (error) {
    console.warn('本地提示音播放失败:', error);
    // 备用方案：使用浏览器默认通知
    playBrowserNotificationSound(type, volume);
  }
}

/**
 * 播放浏览器默认通知音（备选方案）
 */
function playBrowserNotificationSound(type: keyof typeof AUDIO_FILES, volume: number): void {
  try {
    // 使用浏览器的Notification API播放系统默认声音
    if ('Notification' in window && Notification.permission === 'granted') {
      // 创建一个静默的通知来触发系统声音
      const notification = new Notification(' ', {
        silent: true, // 静默通知，只触发系统声音
        requireInteraction: false
      });
      
      // 立即关闭通知
      setTimeout(() => notification.close(), 100);
    }
  } catch (error) {
    console.warn('浏览器通知音播放失败:', error);
    // 最终备用方案：使用console.beep（如果支持）
    if (console.beep) {
      console.beep();
    }
  }
}

/**
 * 播放语音提示
 * @param text 要朗读的文本
 */
export function playVoiceNotification(text: string): void {
  if ('speechSynthesis' in window) {
    try {
      const utterance = new SpeechSynthesisUtterance(text);
      utterance.lang = 'zh-CN';
      utterance.rate = 1.0;
      utterance.pitch = 1.0;
      utterance.volume = 0.5;
      
      // 停止之前的语音
      speechSynthesis.cancel();
      
      // 播放新语音
      speechSynthesis.speak(utterance);
    } catch (error) {
      console.warn('语音合成失败:', error);
    }
  }
}

/**
 * 播放完整的消息通知（声音 + 语音）
 * @param message 消息内容
 * @param type 消息类型
 */
export function playFullNotification(
  message: string,
  type: keyof typeof AUDIO_FILES = 'message'
): void {
  // 播放通知声音
  playNotificationSound(type);
  
  // 播放语音提示（可选，根据用户设置）
  // playVoiceNotification(`您有新的${type === 'message' ? '消息' : type}通知，请及时查阅`);
}

/**
 * 预加载所有音频文件
 */
export function preloadAllAudio(): Promise<void[]> {
  const promises = Object.keys(AUDIO_FILES).map(type => 
    preloadAudio(type as keyof typeof AUDIO_FILES)
  );
  return Promise.all(promises);
}